package pers.wchen.mybatis.generate.compose;

import pers.wchen.mybatis.generate.data.DataManager;
import pers.wchen.mybatis.generate.model.DataComposeVO;
import pers.wchen.mybatis.generate.model.DatabaseTablePropertyVO;
import pers.wchen.mybatis.generate.model.FileInfoVO;
import pers.wchen.mybatis.generate.tag.*;
import pers.wchen.mybatis.generate.template.TemplateManager;
import pers.wchen.mybatis.generate.util.FileUtil;
import pers.wchen.mybatis.generate.util.SysConstant;
import java.util.List;
import java.util.Map;

/**
 * @作者： wchen
 * @描述： 内容合成抽象类
 * @创建时间： 2018/2/10 14:04
 * @版本：Copyright 2018, Inc. All Rights Reserved.
 * @修改信息：
 */
public class DefaultComposeManager implements BaseCompose{

    private Map<String, StringBuffer> tempResultMap;
    private Map<String, DataComposeVO> dataResultMap;
    private String[] queryTableNames;


    /**
     *  @描述: 初始化
     *  @参数： []
     *  @返回值： void
     *  @创建人: wchen
     *  @创建时间: 2018/2/10
     *  @修改人和其它信息:
     */
    private void init(){
        initTempResult();
        initDataResult();
    }



    /**
     * @描述: 获取合成后的字符串
     * @参数：
     * @返回值：
     * @创建人: wchen
     * @创建时间: 2018/2/10
     * @修改人和其它信息:
     */
    public void getComposeContent() {
        init();
        doLoopQueryTables();
    }


    /**
     *  @描述: 遍历要处理的表
     *  @参数： []
     *  @返回值： void
     *  @创建人: wchen
     *  @创建时间: 2018/2/14
     *  @修改人和其它信息:
     */
    private void doLoopQueryTables(){

        for(String tableName : queryTableNames){
            //获取数据集
            DataComposeVO dataComposeVO = dataResultMap.get(tableName);
            doLoopBuildFiles(dataComposeVO, tableName);
        }
    }

    /**
     *  @描述: 创建配置的文件
     *  @参数： [dataComposeVO, tableName]
     *  @返回值： void
     *  @创建人: wchen
     *  @创建时间: 2018/2/14
     *  @修改人和其它信息:
     */
    private void doLoopBuildFiles(DataComposeVO dataComposeVO, String tableName){

        String[] buildFiles = dataComposeVO.getBuildFiles();
        List<DatabaseTablePropertyVO> databaseTablePropertyVOS = dataComposeVO.getDatabaseTablePropertyVOS();
        String tableComponent = dataComposeVO.getTableComponent();
        Map<String, FileInfoVO> fileInfoMap = dataComposeVO.getFileInfoMap();
        //获取模板拼装
        for(String fileName : buildFiles){
            StringBuffer templateSbf = this.tempResultMap.get(fileName);
            if(templateSbf == null || templateSbf.toString().equals("")){
                System.out.println(fileName + " : 不存在");
                continue;
            }
            BaseTagManager baseTagManager = getBaseTagManager(dataComposeVO, tableName, fileName);
            if(baseTagManager == null){
                continue;
            }
            //模板标签处理
            String writeStr = baseTagManager.dealTemplateTag(templateSbf.toString());
            //文件生成
            writeTemplate(writeStr, fileInfoMap.get(fileName));
        }

    }

    /**
     *  @描述: 获取标签管理类
     *  @参数： [dataComposeVO, tableName, fileName]
     *  @返回值： pers.wchen.mybatis.generate.tag.BaseTagManager
     *  @创建人: wchen
     *  @创建时间: 2018/2/14
     *  @修改人和其它信息:
     */
    public BaseTagManager getBaseTagManager(DataComposeVO dataComposeVO, String tableName, String fileName){

        if(SysConstant.KEY_XML.equals(fileName)){
            return new XMLTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_VO.equals(fileName)){
            return new VOTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_SERVICE.equals(fileName)){
            return new ServiceTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_SERVICE_IMPL.equals(fileName)){
            return new ServiceImplTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_DAO.equals(fileName)){
            return new DaoTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_CONTROLLER.equals(fileName)){
            return new ControllerTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_TEST.equals(fileName)){
            return new TestTagManager(dataComposeVO, tableName, fileName);
        }else if(SysConstant.KEY_VIEW.equals(fileName)){
            return new ViewTagManager(dataComposeVO, tableName, fileName);
        }
        return null;
    }


    public void writeTemplate(String writeTemplateStr, FileInfoVO fileInfoVO){
        FileUtil.writeFile(fileInfoVO.getFilePath(), writeTemplateStr);
    }

    /**
     *  @描述: 获取模板结果集
     *  @参数： []
     *  @返回值： java.util.Map<java.lang.String,java.lang.StringBuffer>
     *  @创建人: wchen
     *  @创建时间: 2018/2/10
     *  @修改人和其它信息:
     */
    private void initTempResult() {
        if(this.tempResultMap == null){
            TemplateManager templateManager = new TemplateManager();
            this.tempResultMap = templateManager.getTempResultMap();
        }
    }


    /**
     *  @描述: 获取数据库查询的数据集
     *  @参数： []
     *  @返回值： java.util.Map<java.lang.String,java.lang.StringBuffer>
     *  @创建人: wchen
     *  @创建时间: 2018/2/10
     *  @修改人和其它信息:
     */
    private void initDataResult() {
        DataManager dataManager = new DataManager();
        this.dataResultMap = dataManager.getDataInfo();
        this.queryTableNames = dataManager.getQueryTableNames();
    }
}
